 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
     <script>
/* 
         1.闭包结构
            用一个函数包裹其他函数即可构建闭包结构
            借助于函数本身局部作用域的特性，可以扩展函数的取值范围 
            可以防止全局变量被污染
            */
       /*   var num1="全局变量num1";
         function f1(){
             var num1=0;
             return function(){
                 console.log("f1中的匿名函数；",num1);
                 num1++;
             }
         }
         var fun=f1();
         fun();
         fun();
         fun();
         fun();
         fun(); */

        //  IIFE 立即执行函数表达式，实际上就是闭包函数的自动执行方案

      /*   var num2="全局变量num2";
        var f2=(function(){
            var num2=0;
            return function(){
                console.log("自执行函数中的num2",num2);
                num2++;
            }
        })();
        f2();
        f2();
        f2();
        f2(); */

        // 一般在实际开发中，很少会让自执行函数接收返回值，一般可以使用全局window进行承载共享，一般会以参数的形式进行传递
        // var num=100;
      /*   (function(){
            var num=0;
            window.f3=function(){
                console.log(num);
                num++;
            }

        })();
        window.f3();
        window.f3(); */
       
       /*  (function(w){
            var num=0;
            w.f3=function(){
                console.log(num);
                num++;
            }

        })(window);
        window.f3();
        window.f3(); 
        window.f3(); */

        // es6语法具有块级作用域的概念
        var num3="全局变量num3";
        {
            let num3=0;
            function f4(){
                console.log(num3);
                num3++;
            }

        }
        f4();
        f4();
        f4();

     /*  
       IIFE : (Imdiately Invoked Function Expression ) 立即执行的函数表达式

        ES5 语法中没有块作用域，因此在实际项目开发中，为方式全局变量因变量提升被污染会采用IIFE模式；

        ES6 语法中let 被构建了块作用域，因此可以使用块定义方式替代IIFE模式
 */

     </script>
 </head>
 <body>
     
 </body>
 </html>